package store;

import java.util.HashMap;
import java.util.Scanner;

/**
 * <p>邻接表</p>
 * <p>这种存图方式比较常用，如果同学们参加算法竞赛会学习类似的一种存图方式，只不过邻接表采用的是链表，竞赛则采用数组</p>
 * <p>这里我们仅展示有向图的存图（无向图就是多了个反方向再存一次）</p>
 * <p>这种存图方式适用于稀疏图</p>
 *
 * @author 没天赋
 * @since 2025-03-10
 */
public class AdjacencyList {
    public static void main(String[] args) {
        // 最大顶点数
        final int N = 105;
        // 顶点数,边数,查询次数
        int n, m, k;
        Scanner sc = new Scanner(System.in);
        // 创建邻接表
        class edge {
            char c;
            int val;
            edge next;
        }
        // 创建头结点
        HashMap<Character, edge> headList = new HashMap<>(N);
        // 读取顶点数,边数,查询次数
        n = sc.nextInt();
        m = sc.nextInt();
        k = sc.nextInt();
        // 读取顶点与下标对应的哈希表
        for (int i = 1; i <= n; i++) {
            headList.put(sc.next().charAt(0), null);
        }
        for (int i = 0; i < m; i++) {
            // 读取边
            char x = sc.next().charAt(0);
            char y = sc.next().charAt(0);
            // 读取边的权值
            int val = sc.nextInt();
            edge newEdge = new edge();
            newEdge.c = y;
            newEdge.val = val;
            newEdge.next = headList.get(x);
            // 和链表的插入相同，使用头插法
            headList.put(x, newEdge);
        }
        for (int i = 0; i < k; i++) {
            // 读取边
            char x = sc.next().charAt(0);
            char y = sc.next().charAt(0);
            // 输出边权
            edge p = headList.get(x);
            // 是否找到对应边标志
            boolean flag = false;
            while (p != null) {
                // 找到目标边输出并将标志设为true
                if (p.c == y) {
                    System.out.println(p.val);
                    flag = true;
                }
                p = p.next;
            }
            // 未找到则返回信息
            if (!flag) {
                System.out.println("无边相连");
            }
        }
    }
}
/**
 * 测试数据同邻接矩阵
 */
